package com.enba.mall.core.goods.spu.tool;

import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.enba.mall.core.goods.sku.entity.SkuSpec;
import com.enba.mall.core.goods.sku.entity.SkuSpecEnum;
import com.enba.mall.core.goods.sku.mapper.SkuSpecEnumMapper;
import com.enba.mall.core.goods.sku.mapper.SkuSpecMapper;
import com.enba.mall.core.goods.spu.resp.ProductDetailResponse;
import com.enba.mall.core.goods.spu.resp.ProductDetailResponse.SpecValue;
import java.util.ArrayList;
import java.util.List;
import org.springframework.stereotype.Component;

@Component
public class SkuSpecEnumsUtil {

  private final SkuSpecMapper skuSpecMapper;
  private final SkuSpecEnumMapper skuSpecEnumMapper;

  public SkuSpecEnumsUtil(SkuSpecMapper skuSpecMapper, SkuSpecEnumMapper skuSpecEnumMapper) {
    this.skuSpecMapper = skuSpecMapper;
    this.skuSpecEnumMapper = skuSpecEnumMapper;
  }

  /**
   * 组装参数
   *
   * @param spuId spuId
   * @return 根据spuId获取所有参数名称和参数值
   */
  public List<ProductDetailResponse.SpecDetail> assembleSpec(Long spuId) {
    List<SkuSpec> specList =
        skuSpecMapper.selectList(Wrappers.<SkuSpec>lambdaQuery().eq(SkuSpec::getSpuId, spuId));

    List<ProductDetailResponse.SpecDetail> specDetails = new ArrayList<>();
    for (SkuSpec spec : specList) {
      ProductDetailResponse.SpecDetail specDetail = new ProductDetailResponse.SpecDetail();
      specDetail.setId(spec.getId());
      specDetail.setSpecName(spec.getSpecName());

      // 查询参数值
      List<SkuSpecEnum> enumList =
          skuSpecEnumMapper.selectList(
              Wrappers.<SkuSpecEnum>lambdaQuery().eq(SkuSpecEnum::getSpecId, spec.getId()));

      List<SpecValue> specValues = new ArrayList<>();
      for (SkuSpecEnum specEnum : enumList) {
        SpecValue specValue = new SpecValue();
        specValue.setId(specEnum.getId());
        specValue.setSpecId(specEnum.getSpecId());
        specValue.setSpecValue(specEnum.getSpecValue());
        specValue.setSpecName(spec.getSpecName());
        specValues.add(specValue);
      }
      specDetail.setValues(specValues);

      specDetails.add(specDetail);
    }

    return specDetails;
  }
}
